package vengadores;


import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.lcdui.game.Sprite;
/**
 *Es la clase que crea la historia del juego. Utiliza un Sprite y dependiendo de la parte de la historia que se desee desplegar, se utiliza el frame correspondiente en el Sprite.
 * Extiende de GameCanvas para manejar eventos del teclado y es Animable para dibujarla y actualizarla.
 * @author Felipe Donato Arrazola Gómez
 * @author Jorge de Jesús Tinoco Huesca
 * @author Arturo Ayala Tello
 */
public class Historia extends GameCanvas implements Animable{

    private AppJuego midlet;//es el midlet al cual pertenece la historia
    private int ANCHO, ALTO;//Son las medidas de la pantalla
    private Animador animador;//Objeto que se encarga de animar en pantalla
    private Graphics g;//Entorno gráfico en el cual se dibujan todos los objetos
    private Sprite imagen;//es la imagen de la historia
    private boolean botonApretado = false; //bandera que controla el presionar los botones
    private int sexo;//es el genero del personaje seleccionado
    private int nivel;//es el nivel al cual pertenece la historia
    private int score;//puntaje hecho por el juego previo a la historia

    /**
     *Constructor de la clase que crea el objeto de tipo Historia, que desplegará la historia entre cada nivel.
     * @param midlet Es el midlet donde se ejecutará el GameCanvas
     * @param sexo Indica el sexo del personaje que eligió el jugador.
     * @param nivel Es el nivel del juego en el que se encuentra el jugador.
     */

    public Historia(AppJuego midlet, int sexo, int nivel, int score){
        super(true);
        this.sexo = sexo;
        this.score = score;
        setFullScreenMode(true);
        ANCHO = getWidth();
        ALTO = getHeight();
        g = getGraphics();
        this.midlet = midlet;
        this.nivel = nivel;
        setFullScreenMode(true);
        try{
            imagen = new Sprite(Image.createImage("/HistoriaCompleta.png"),ANCHO,ALTO);
            if (midlet.deseaReproducir())
                midlet.reproducir("pmu.mid");
        }catch(Exception e){
            e.printStackTrace();
        }
        imagen.setFrame((this.sexo*5) + this.nivel);
        animador = new Animador(this);
        animador.iniciar();

    }

    /**
     * Se encarga de mantener el juego al tanto de cualquier evento que se produzca, haciendo los cambios pertinentes en el mismo.
     * Lo llama el Animador del juego para hacer la animación.
     */
    public void actualizar() {
        int tecla = getKeyStates();

        if ((tecla & FIRE_PRESSED) != 0  && !botonApretado) {
            if(imagen.getFrame()==0){
                terminar();
                midlet.ponerPantalla(new Menu(midlet, Menu.SELECCION,0));
                midlet = null;
                return;
            }else{
                terminar();
                if (nivel == 4 || nivel == 9){
                    try {
                        midlet.ponerPantalla(new Pantalla(midlet, Pantalla.CREDITOS_FINAL));
                        midlet.guardarJuego(0, 0, 0, 0, 0, 0, false);
                    } catch (Exception ex) {
                        ex.printStackTrace();
                    }
                }else if (nivel == 5 || nivel == 10){
                    System.out.println("perdiste");
                    if (midlet.analizar(score)){
                        try {
                            midlet.ponerPantalla(new Pantalla(midlet, Pantalla.CAPTURA));
                        } catch (Exception ex) {
                            ex.printStackTrace();
                        }
                    }else{
                        midlet.ponerPantalla(new Menu(midlet, Menu.PRINCIPAL, 0));
                    }
                    midlet.guardarJuego(0, 0, 0, 0, 0, 0, false);
                }else
                    midlet.ponerPantalla(new Juego(midlet, sexo, nivel,score));
                midlet = null;
                return;
            }
        }else if(tecla == 0){
            botonApretado = false;
        }
    }

    /**
    * Método que se usa para dibujar los elementos que aparecerán en pantalla. Se usa por el Animador para dibujar en el juego.
    */

    public void dibujar() {
        g.setColor(0x000000);
        g.drawRect(0, 0, ANCHO, ALTO);
        imagen.paint(g);
        flushGraphics();
    }

    //Método que elemina todas las referencias de la clase
    private void terminar(){
        if(midlet.estaReproduciendo())
            midlet.detenerMusica();
        animador.terminar();
        animador = null;
        g = null;
        imagen = null;
    }

}
